package gmath

import (
	"math"

	"gitee.com/makitdone/gx"
)

// 取最小值
func Min[T gx.Number](values ...T) T {
	if len(values) == 0 {
		panic("Min function called with no arguments")
	}
	var minValue = values[0]
	for _, value := range values {
		if value < minValue {
			minValue = value
		}
	}
	return minValue
}

// 取最大值
func Max[T gx.Number](values ...T) T {
	if len(values) == 0 {
		panic("Max function called with no arguments")
	}
	var maxValue = values[0]
	for _, value := range values {
		if value > maxValue {
			maxValue = value
		}
	}
	return maxValue
}

// Clamp 将值限制在 min 和 max 之间
func Clamp[T gx.Number](value, min, max T) T {
	v := math.Min(math.Max(float64(value), float64(min)), float64(max))
	return T(v)
}
